﻿using GrapeCity.Forguncy.CellTypes;
using GrapeCity.Forguncy.Commands;
using GrapeCity.Forguncy.Plugin;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Windows;
using Vant.Properties;
using Vant.WpfControls.DrawingObject;

namespace Vant.CellTypes
{
    public class StepsDesigner : CellTypeDesigner<Steps>, ISupportPropertyInitialize
    {
        public override FrameworkElement GetDrawingControl(ICellInfo cellInfo, IDrawingHelper drawingHelper)
        {
            if (this.CellType.direction == "horizontal")
            {
                return new HorizontalStepDrawingObject(this.CellType, cellInfo, drawingHelper);
            }
            else
            {
                return new VerticalStepDrawingObject(this.CellType, cellInfo, drawingHelper);
            }
        }

        public void InitDefaultPropertyValues(IBuilderContext context)
        {
            for (int i = 0; i < 3; i++)
            {
                this.CellType.options.Add(new Step()
                {
                    value = (i + 1).ToString(),
                    title = Resources.Steps_DefaultName + (i + 1).ToString()
                });
            }
            this.CellType.activeColor = "Accent 1";
            this.CellType.inactiveColor = "#969799";
        }
    }

    [Designer("Vant.CellTypes.StepsDesigner, Vant")]
    [Icon("pack://application:,,,/Vant;component/Resources/Images/Steps.png")]
    [OrderWeight((int)Utils.OrderWeight.Steps)]
    public class Steps : VantCellTypeBase, ICommandCellType, ISupportDefaultValue, IStepBase
    {
        [SRDisplayName(nameof(Resources.ValueChangeCommand))]
        public List<Command> CommandList { get; set; } = new List<Command>();

        public CommandExcuteKind CommandExcuteKind => CommandExcuteKind.OnValueChanged;

        [SRDisplayName(nameof(Resources.Vant_DefaultValue))]
        [FormulaProperty]
        public object DefaultValue { get; set; }

        [SRDisplayName(nameof(Resources.Steps_UseBinding))]
        [BoolProperty]
        [MergableProperty(false)]
        public bool useBinding { get; set; } = false;

        [SRDisplayName(nameof(Resources.Steps_Options))]
        [ListProperty(IndentLevel = 1, MinCount = 2)]
        public List<Step> options { get; set; } = new List<Step>();

        [SRBindingDataSourceProperty(Columns = nameof(Resources.Steps_BindingOptions_Columns), IndentLevel = 1)]
        [SRDisplayName(nameof(Resources.BindingOptions))]
        public object bindingOptions { get; set; }

        [SRDisplayName(nameof(Resources.Steps_Direction))]
        [SRRadioGroupProperty(ValueList = "horizontal|vertical", DisplayList = nameof(Resources.Steps_Direction_DisplayList))]
        public string direction { get; set; } = "horizontal";

        [SRDisplayName(nameof(Resources.Steps_ActiveIcon))]
        [IconProperty(DefaultIconColor = "#07c160")]
        public ImageValue activeIcon { get; set; }

        [SRDisplayName(nameof(Resources.Steps_FinishIcon))]
        [IconProperty(DefaultIconColor = "#07c160")]
        public ImageValue finishIcon { get; set; }

        [SRDisplayName(nameof(Resources.Steps_ActiveColor))]
        [ColorProperty]
        public string activeColor { get; set; }

        [SRDisplayName(nameof(Resources.Steps_InactiveIcon))]
        [IconProperty(DefaultIconColor = "#969799")]
        public ImageValue inactiveIcon { get; set; }

        [SRDisplayName(nameof(Resources.Steps_InactiveColor))]
        [ColorProperty]
        public string inactiveColor { get; set; }

        [Browsable(false)]
        [JsonIgnore]
        public bool NeedFormatDefaultValue { get; set; } = true;

        [RunTimeMethod]
        [SRDisplayName(nameof(Resources.Steps_UpdateActiveIcon))]
        public void UpdateActiveIcon(
        [SRItemDisplayName(nameof(Resources.Steps_ActiveIcon))]
            [IconProperty]
            ImageValue activeIcon)
        {
            //
        }

        [RunTimeMethod]
        [SRDisplayName(nameof(Resources.Steps_UpdateActiveColor))]
        public void UpdateActiveColor(
            [SRItemDisplayName(nameof(Resources.Steps_ActiveColor))]
            [ColorProperty(SupportNoFill = true)]
            ImageValue activeColor)
        {
            //
        }

        public override string ToString()
        {
            return Properties.Resources.Steps;
        }

        public override bool GetDesignerPropertyVisible(string propertyName)
        {
            if (propertyName == nameof(options))
            {
                return !useBinding;
            }
            if (propertyName == nameof(bindingOptions))
            {
                return useBinding;
            }
            return base.GetDesignerPropertyVisible(propertyName);
        }
    }

    public interface IStepBase
    {
        ImageValue activeIcon { get; set; }
        ImageValue inactiveIcon { get; set; }
        ImageValue finishIcon { get; set; }
        string activeColor { get; set; }
        string inactiveColor { get; set; }
    }

    public class Step
    {
        [SRDisplayName(nameof(Resources.Value))]
        public string value { get; set; }

        [SRDisplayName(nameof(Resources.Steps_Title))]
        public string title { get; set; }
    }
}
